home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 5817 / 5817.xpi / chrome / content / treeDbStructure.js < prev    next >
Text File  |  2010-02-11  |  7KB  |  206 lines

  1. //this class manages the db tree on the left. It is used to create two objects:
  2. //one, for normal db objects and the other for temp objects
  3. function TreeDbStructure(sTreeId, sTreeChildrenId, iDbObjects) {
  4.   this.mTreeId = sTreeId;
  5.   this.mTreeChildrenId = sTreeChildrenId;
  6.   this.miDbObjects = iDbObjects;
  7.  
  8.   //an array of two members: first member is an array telling which
  9.   //categories to expand and the second is a list of object names to expand
  10.   this.aExpandedNodes = [[], []];
  11.   this.visibleData = [];
  12.   this.childData = [];
  13. }
  14.  
  15. TreeDbStructure.prototype = {
  16.   mbSettingChildren: false,
  17.   mAllPrefix: "all-",
  18.  
  19.   init: function() {
  20.      document.getElementById(this.treeId).view = this;
  21.   },
  22.  
  23.   removeChildData: function() {
  24.     this.visibleData = [[sm_getLStr("noDb"), true, false]];
  25.     this.init();
  26.   },
  27.   
  28.   setChildData: function(aObjects)  {
  29.     this.mbSettingChildren = true;
  30.  
  31.     this.visibleData = [];
  32.     this.childData = [];
  33.  
  34.     var arr = ["master", "table", "view", "index", "trigger"];
  35.     if (this.miDbObjects == 1) arr = ["table"];
  36.  
  37.     var lbl = ["Master Table", "Tables", "Views", "Indexes", "Triggers"];
  38.     for (var pp = 0; pp < arr.length; pp++) {
  39.       var idx = arr[pp];
  40.       if (aObjects[idx]) {
  41.         this.childData[idx] = aObjects[idx];
  42.  
  43.         var sLabel = lbl[pp] + " (" + aObjects[idx].length + ")";
  44.       //[cellText, isContainer, isContainerOpen, SmType, iLevel]
  45.       //SmType is application defined attribute set by the extension author here
  46.         this.visibleData.push([sLabel, true, false, this.mAllPrefix+idx,0]);
  47.       }
  48.     }
  49.  
  50.     //for categories
  51.     for (var iii=0; iii < this.rowCount; iii++) {
  52.       if (this.getLevel(iii) == 0) {
  53.         for (var jjj=0; jjj < this.aExpandedNodes[0].length; jjj++) {
  54.           if (this.aExpandedNodes[0][jjj] == this.getSmType(iii)) {
  55.             this.toggleOpenState(iii);
  56.           }
  57.         }
  58.       }
  59.     }
  60.     //for db objects
  61.     for (var iii=0; iii < this.rowCount; iii++) {
  62.       if (this.getLevel(iii) == 1) {
  63.         for (var jjj=0; jjj < this.aExpandedNodes[1].length; jjj++) {
  64.           if (this.aExpandedNodes[1][jjj] == this.getCellText(iii)) {
  65.             this.toggleOpenState(iii);
  66.           }
  67.         }
  68.       }
  69.     }
  70.  
  71.     this.mbSettingChildren = false;
  72.     this.init();
  73.   },
  74.  
  75.   setExpandableNodes: function(aExpand) {
  76.     this.aExpandedNodes = aExpand;
  77.   },
  78.  
  79.   get treeId() { return this.mTreeId; },
  80.   get treeChildrenId() { return this.mTreeChildrenId; },
  81.   get visibleDataLength() { return this.visibleData.length; },
  82.   getSmType: function(row) { return this.visibleData[row][3]; },
  83.   isTreeReady: function() { return !this.mbSettingChildren; },
  84.  
  85.   //following are treeview functions
  86.   treeBox: null,
  87.   selection: null,
  88.  
  89.   get rowCount() { return this.visibleData.length; },
  90.   setTree: function(treeBox) { this.treeBox = treeBox; },
  91.   getCellText: function(row,col) { return this.visibleData[row][0]; },
  92.   isContainer: function(idx) { return this.visibleData[idx][1]; },
  93.   isContainerOpen: function(idx) { return this.visibleData[idx][2]; },
  94.   isContainerEmpty: function(idx)    { return false; },
  95.   isSeparator: function(idx)         { return false; },
  96.   isSorted: function()               { return false; },
  97.   isEditable: function(idx, column)  { return false; },
  98.   getLevel: function(idx) { return this.visibleData[idx][4]; },
  99.   getParentIndex: function(idx) {
  100.     var iLevel = this.getLevel(idx);
  101.     for (var t = idx - 1; t >= 0 ; t--) {
  102.       if (this.getLevel(t) < iLevel) return t;
  103.     }
  104.     return -1;
  105.   },
  106.  
  107.   hasNextSibling: function(idx, after) {
  108.     var thisLevel = this.getLevel(idx);
  109.     for (var t = idx + 1; t < this.visibleData.length; t++) {
  110.       var nextLevel = this.getLevel(t)
  111.       if (nextLevel == thisLevel) return true;
  112.       else if (nextLevel < thisLevel) return false;
  113.     }
  114.     return false;
  115.   },
  116.   //do not return in between because the this.aExpandedNodes array is being populated at the end.
  117.   toggleOpenState: function(idx) {
  118.     if (!this.isContainer(idx)) return;
  119.  
  120.     var thisLevel = this.getLevel(idx);
  121.     var item = this.visibleData[idx];
  122.  
  123.     if (this.isContainerOpen(idx)) {
  124.       this.visibleData[idx][2] = false;
  125.  
  126.       var deletecount = 0;
  127.       for (var t = idx + 1; t < this.visibleData.length; t++) {
  128.         if (this.getLevel(t) > thisLevel) deletecount++;
  129.         else break;
  130.       }
  131.       if (deletecount) {
  132.         this.visibleData.splice(idx + 1, deletecount);
  133.         this.treeBox.rowCountChanged(idx + 1, -deletecount);
  134.       }
  135.     }
  136.     else {
  137.       this.visibleData[idx][2] = true;
  138.  
  139.       if(thisLevel == 0) {
  140.         var label = this.getSmType(idx).substring(this.mAllPrefix.length);
  141.         var toinsert = this.childData[label];
  142.         var sType = label;
  143.         var bContainer = false;
  144.         if (label == "table" || label == "master") bContainer = true;
  145.  
  146.         for (var i = 0; i < toinsert.length; i++) {
  147.            this.visibleData.splice(idx + i + 1, 0, [toinsert[i], bContainer,false,sType,thisLevel + 1]);
  148.         }
  149.         this.treeBox.rowCountChanged(idx + 1, toinsert.length);
  150.       }
  151.  
  152.       if(thisLevel == 1 && (this.getSmType(idx) == "table" || this.getSmType(idx) == "master")) {
  153.         var info = Database.getTableInfo(this.getCellText(idx), "");
  154. //        var cols = info[0];
  155.         for(var i = 0; i < info.length; i++) {
  156.           this.visibleData.splice(idx + i + 1, 0, [[info[i].name], false,false,"someColumn",thisLevel + 1]);
  157.         }
  158.         this.treeBox.rowCountChanged(idx + 1, info.length);
  159.       }
  160.     }
  161.     //use indexOf to search, then add or delete
  162.     //populate aExpandedNodes again
  163.     if (!this.mbSettingChildren) {
  164.       this.aExpandedNodes = [[],[]];
  165.       for (var iii = 0; iii < this.rowCount; iii++) {
  166.         if (this.isContainerOpen(iii)) {
  167.           if (this.getLevel(iii) == 0)
  168.             this.aExpandedNodes[0].push(this.getSmType(iii));
  169.           if (this.getLevel(iii) == 1)
  170.             this.aExpandedNodes[1].push(this.getCellText(iii));
  171.         }
  172.       }
  173.     }
  174.   },
  175.  
  176.   getImageSrc: function(idx, column) {},
  177.   getProgressMode : function(idx,column) {},
  178.   getCellValue: function(idx, column) {},
  179.   cycleHeader: function(col, elem) {},
  180.   selectionChanged: function() {},
  181.   cycleCell: function(idx, column) {},
  182.   performAction: function(action) {},
  183.   performActionOnCell: function(action, index, column) {},
  184.   getRowProperties: function(idx, column, prop) {},
  185.   getCellProperties: function(row, col, properties) {
  186.     var atomService = Components.classes["@mozilla.org/atom-service;1"].getService(Components.interfaces.nsIAtomService);
  187.     if (this.getSmType(row) == "table") {
  188.       var atom = atomService.getAtom("dbObjTable");
  189.       properties.AppendElement(atom);
  190.     }
  191.     if (this.getSmType(row) == "index") {
  192.       var atom = atomService.getAtom("dbObjIndex");
  193.       properties.AppendElement(atom);
  194.     }
  195.     if (this.getSmType(row) == "view") {
  196.       var atom = atomService.getAtom("dbObjView");
  197.       properties.AppendElement(atom);
  198.     }
  199.     if (this.getSmType(row) == "trigger") {
  200.       var atom = atomService.getAtom("dbObjTrigger");
  201.       properties.AppendElement(atom);
  202.     }
  203.   },
  204.   getColumnProperties: function(column, element, prop) {}
  205. };
  206.